package controller;

import java.util.ArrayList;
import java.util.List;

import model.entidades.Paciente;
import model.repositorio.EnderecoPacienteDAO;
import model.repositorio.PacienteDAO;
import utils.Validacao;
import view.paciente.TelaCadastrarPaciente;

public class ControladorPaciente {

	private TelaCadastrarPaciente tela;
	private PacienteDAO pacienteDAO;
	private EnderecoPacienteDAO enderecoPacienteDAO;
	
	final boolean VALIDO = false;
	final boolean INVALIDO = true;
	
	public ControladorPaciente(TelaCadastrarPaciente tela){
		this.tela = tela;
		pacienteDAO = new PacienteDAO();
		enderecoPacienteDAO = new EnderecoPacienteDAO();
	}
	
	public void salvar(Paciente paciente) throws ControladorExcecao {
		int contaErros = 0;
		if (paciente == null) {
			throw new ControladorExcecao(ControladorExcecao.PACIENTE_NULO);
		} else {
			
			if(tela.getComboBoxRgUF().getSelectedIndex() != 0 && (paciente.getRgNumero().length() == 0 || paciente.getRgOrgao().length() == 0)) {
				tela.mostraCampoInvalido(tela.getLblRg(), INVALIDO);
				throw new ControladorExcecao(ControladorExcecao.ERRO_RG_UF);
			} else {
				tela.mostraCampoInvalido(tela.getLblRg(), VALIDO);
			}
			
			if (paciente.getNome() != null && paciente.getNome().length() > 2) {
				tela.mostraCampoInvalido(tela.getLblNomeCompleto(), VALIDO);
			} else {
				contaErros++;
				tela.mostraCampoInvalido(tela.getLblNomeCompleto(), INVALIDO);
			}
			
			if (paciente.getDataNascimento() != null) {
				tela.mostraCampoInvalido(tela.getLblDataNascimento(), VALIDO);
			} else {
				contaErros++;
				tela.mostraCampoInvalido(tela.getLblDataNascimento(), INVALIDO);
			}
			
			if (paciente.getCpf() != null && paciente.getCpf().length() == 11) {
				tela.mostraCampoInvalido(tela.getLblCpf(), VALIDO);
			} else {
				contaErros++;
				tela.mostraCampoInvalido(tela.getLblCpf(), INVALIDO);
			}
			
			if (paciente.getNomeMae() != null && paciente.getNomeMae().length() > 3) {
				tela.mostraCampoInvalido(tela.getLblNomeMae(), VALIDO);
			} else {
				contaErros++;
				tela.mostraCampoInvalido(tela.getLblNomeMae(), INVALIDO);
			}
			
			if (paciente.getEndereco().getLogradouro() != null && paciente.getEndereco().getLogradouro().length() > 3) {
				tela.mostraCampoInvalido(tela.getLblLogradouro(), VALIDO);
			} else {
				contaErros++;
				tela.mostraCampoInvalido(tela.getLblLogradouro(), INVALIDO);
			}
			
			if (paciente.getEndereco().getCidade() != null && paciente.getEndereco().getCidade().length() >= 3) {
				tela.mostraCampoInvalido(tela.getLblCidade(), VALIDO);
			} else {
				contaErros++;
				tela.mostraCampoInvalido(tela.getLblCidade(), INVALIDO);
			}
			
			if (paciente.getEndereco().getCep() != null && paciente.getEndereco().getCep().length() == 8) {
				tela.mostraCampoInvalido(tela.getLblCep(), VALIDO);
			} else {
				contaErros++;
				tela.mostraCampoInvalido(tela.getLblCep(), INVALIDO);
			}
			
			if (paciente.getEmail().length() > 0 && !Validacao.verificaEmail(paciente.getEmail())) {
				contaErros++;
				tela.mostraCampoInvalido(tela.getLblEmail(), INVALIDO);
			} else {
				tela.mostraCampoInvalido(tela.getLblEmail(), VALIDO);
			}
		}
		
		if (contaErros > 0) {
			throw new ControladorExcecao(ControladorExcecao.ERRO_VALIDACAO);
		} else {
			Paciente pacienteTeste = pacienteDAO.buscaPorCPF(paciente.getCpf());
			if(pacienteTeste == null || pacienteTeste.getId() == paciente.getId()) {
				enderecoPacienteDAO.salvar(paciente.getEndereco());
				pacienteDAO.salvar(paciente);
			} else {
				tela.mostraCampoInvalido(tela.getLblCpf(), INVALIDO);
				throw new ControladorExcecao(ControladorExcecao.CPF_PACIENTE_CADASTRADO);
			}
		}
	}
	
	public List<Paciente> pesquisarPacienteCPF(String cpf) throws ControladorExcecao {
		
		Paciente paciente = pacienteDAO.buscaPorCPF(cpf);
		if( paciente == null) { 
			throw new ControladorExcecao(ControladorExcecao.CPF_PACIENTE_NAO_ENCONTRADO);
		}
		
		List<Paciente> lista = new ArrayList<Paciente>();
		lista.add(paciente);
		
		return lista;
		
	}
	
	public List<Paciente> pesquisarPacienteNome(String nome) throws ControladorExcecao {
		
		List<Paciente> pacientes = pacienteDAO.buscaPorNome(nome);
		
		if( pacientes == null) { 
			throw new ControladorExcecao(ControladorExcecao.NOME_PACIENTE_NAO_ENCONTRADO);
		}
		
		return pacientes;
		
	}
	
}